From f89d5c828038654802526c9ea68e6fb52fa461d3 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Tue, 7 Aug 2012 00:38:48 -0400 Subject: [PATCH] Optimize gtk_widget_path_copy() by preallocating "elems" array gtk_widget_path_copy() currently calls g_array_append_val() in a loop, which is inefficient due to reallocating the array's memory. Calling g_array_set_size() before entering the loop reduces the number of CPU cycles used by roughly 30%. Patch by John Lindgren, https://bugzilla.gnome.org/show_bug.cgi?id=679978 --- gtk/gtkwidgetpath.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/gtk/gtkwidgetpath.c b/gtk/gtkwidgetpath.c index 00afbe0b9e..855902fd68 100644 --- a/gtk/gtkwidgetpath.c +++ b/gtk/gtkwidgetpath.c @@ -174,15 +174,16 @@ gtk_widget_path_copy (const GtkWidgetPath *path) new_path = gtk_widget_path_new (); + g_array_set_size (new_path->elems, path->elems->len); + for (i = 0; i < path->elems->len; i++) { - GtkPathElement *elem, new; + GtkPathElement *elem, *dest; elem = &g_array_index (path->elems, GtkPathElement, i); + dest = &g_array_index (new_path->elems, GtkPathElement, i); - gtk_path_element_copy (&new, elem); - - g_array_append_val (new_path->elems, new); + gtk_path_element_copy (dest, elem); } return new_path; -- 2.30.2